/**
 * Copyright (c) 2006-2015, JGraph Ltd
 * Copyright (c) 2006-2015, Gaudenz Alder
 */
var mxObjectIdentity = {
  /**
   * Class: mxObjectIdentity
   *
   * Identity for JavaScript objects and functions. This is implemented using
   * a simple incrementing counter which is stored in each object under
   * <FIELD_NAME>.
   *
   * The identity for an object does not change during its lifecycle.
   *
   * Variable: FIELD_NAME
   *
   * Name of the field to be used to store the object ID. Default is
   * <code>mxObjectId</code>.
   */
  FIELD_NAME: "mxObjectId",

  /**
   * Variable: counter
   *
   * Current counter.
   */
  counter: 0,

  /**
   * Function: get
   *
   * Returns the ID for the given object or function or null if no object
   * is specified.
   */
  get: function (obj) {
    if (obj != null) {
      if (obj[mxObjectIdentity.FIELD_NAME] == null) {
        if (typeof obj === "object") {
          var ctor = mxUtils.getFunctionName(obj.constructor);
          obj[mxObjectIdentity.FIELD_NAME] =
            ctor + "#" + mxObjectIdentity.counter++;
        } else if (typeof obj === "function") {
          obj[mxObjectIdentity.FIELD_NAME] =
            "Function#" + mxObjectIdentity.counter++;
        }
      }

      return obj[mxObjectIdentity.FIELD_NAME];
    }

    return null;
  },

  /**
   * Function: clear
   *
   * Deletes the ID from the given object or function.
   */
  clear: function (obj) {
    if (typeof obj === "object" || typeof obj === "function") {
      delete obj[mxObjectIdentity.FIELD_NAME];
    }
  },
};
